home *** CD-ROM | disk | FTP | other *** search
/ STraTOS 1997 April & May / STraTOS 1 - 1997 April & May.iso / CD01 / INTERNET / SITES / LITTLE / BMSRC.ZIP / TIMING.S < prev    next >
Encoding:
Text File  |  1997-02-02  |  9.5 KB  |  452 lines

  1. *=======================================================*
  2. *    Timing module: latest update 25/03/96        *
  3. *=======================================================*
  4. *    Interrupts for timing & synchronisation        *
  5. *=======================================================*
  6.  
  7. timerb        =    $120
  8. timerc        =    $114
  9.  
  10. tbcr        =    $fffffa1b
  11. cdcr        =    $fffffa1d
  12. tbdr        =    $fffffa21
  13. tcdr        =    $fffffa23
  14. iera        =    $fffffa07
  15. ierb        =    $fffffa09
  16. imra        =    $fffffa13
  17. imrb        =    $fffffa15
  18. isra        =    $fffffa0f
  19.  
  20. frames_per_sec
  21.  
  22. *-------------------------------------------------------*
  23. init_timing:
  24. *-------------------------------------------------------*
  25.     ifd        debuggable
  26.     move.l        $4d2.w,old_vbi
  27.     move.l        #new_vbi,$4d2.w
  28.     elseif
  29.     push.w        sr
  30.     or.w        #$700,sr
  31.     move.b        iera.w,old_iera
  32.     move.b        ierb.w,old_ierb
  33.     move.b        imra.w,old_imra
  34.     move.b        imrb.w,old_imrb
  35.     move.l        timerb.w,old_timerb
  36.     move.b        #0,tbcr.w
  37.     bclr        #0,iera.w
  38.     move.l        #stabilizer_b,timerb.w
  39.     move.b        #180,tbdr.w
  40.     bset        #0,iera.w
  41.     bset        #0,imra.w
  42.     move.l        $70.w,old_vbi
  43.     move.l        #new_vbi,$70.w
  44.     move.l        timerc.w,old_timerc
  45.     move.l        #framecounter,timerc.w
  46.     and.b        #%00001111,cdcr.w
  47.     move.b        #192,tcdr.w        ; 2457600/192 = 12800Hz
  48.     or.b        #(5<<4),cdcr.w        ; 12800/64 = 200Hz
  49.     pop.w        sr
  50.     endc
  51.     ifd        enable_timing
  52.     bsr        init_font
  53.     endc
  54.     rts
  55.  
  56. *-------------------------------------------------------*
  57. reset_timing:
  58. *-------------------------------------------------------*
  59.     ifd        debuggable
  60.     move.l        old_vbi,$4d2.w
  61.     elseif
  62.     push.w        sr
  63.     or.w        #$700,sr
  64.     move.l        old_vbi,$70.w
  65.     move.l        old_timerb,timerb.w
  66.     move.l        old_timerc,timerc.w
  67.     move.b        old_iera,iera.w
  68.     move.b        old_ierb,ierb.w
  69.     move.b        old_imra,imra.w
  70.     move.b        old_imrb,imrb.w
  71.     pop.w        sr
  72.     endc
  73.     rts
  74.  
  75. *-------------------------------------------------------*
  76.     txtlong
  77. *-------------------------------------------------------*
  78. timing:
  79. *-------------------------------------------------------*
  80.     ifd        show_timing
  81.     ifd        enable_timing
  82.     move.w        #8,char_x
  83.     move.w        #8,char_y
  84.     move.w        #$FFFF,char_col
  85.     lea        stringspace,a0
  86.     clr.b        (a0)
  87.     move.l        a0,numtext_ptr
  88.     ifd        frames_per_sec
  89.     lea        fps,a0
  90.     bsr        pushtext
  91.     bsr        average_times
  92.     move.l        #200*8,d0
  93.     swap        d0
  94.     divu.l        d1,d0
  95.     push.l        d0
  96.     mulu.w        #10000,d0
  97.     swap        d0
  98.     ext.l        d0
  99.     moveq        #4,d7
  100.     bsr        pushdigits
  101.     lea        point,a0
  102.     bsr        pushtext
  103.     pop.l        d0
  104.     swap        d0
  105.     ext.l        d0
  106.     moveq        #1,d7
  107.     bsr        pushdigits
  108.     elseif
  109.     lea        frames,a0
  110.     bsr        pushtext
  111.     bsr        average_times
  112.     move.l        d1,d0
  113.     moveq        #1,d7
  114.     bsr        pushdigits
  115.     endc
  116.     move.l        numtext_ptr,a0
  117.     jsr        print_line
  118.     endc
  119.     endc
  120.     rts
  121.  
  122. *-------------------------------------------------------*
  123.     txtlong
  124. *-------------------------------------------------------*
  125. average_times:
  126. *-------------------------------------------------------*
  127.     ifd        frames_per_sec
  128.     lea        fc_history,a0
  129.     moveq        #8-2,d0
  130.     move.l        fpsc,d1
  131.     clr.l        fpsc
  132.     move.l        d1,d3
  133. .lp:    move.l        4(a0),d2
  134.     add.l        d2,d1
  135.     move.l        d2,(a0)+
  136.     dbra        d0,.lp
  137.     move.l        d3,(a0)
  138.     add.l        fpso,d1
  139.     lsr.l        d1
  140.     move.l        d1,fpso
  141.     elseif
  142.     move.l        ovbls,d1
  143.     add.l        vbls,d1
  144.     clr.l        vbls
  145.     lsr.l        d1
  146.     move.l        d1,ovbls
  147.     endc
  148.     rts
  149.     
  150. *-------------------------------------------------------*
  151.     txtlong
  152. *-------------------------------------------------------*
  153. pushdigits:
  154. *-------------------------------------------------------*
  155. ;    d0     =     number
  156.     move.l        numtext_ptr,a0
  157.     move.l        a0,a1
  158.     moveq        #'0',d3
  159.     move.l        d3,d1
  160.     moveq        #10,d4
  161.     tst.l        d0
  162.     beq.s        .zero
  163. .loop    ext.l        d0
  164.     divu        d4,d0
  165.     move.l        d0,d1
  166.     swap        d1
  167.     add.w        d3,d1
  168. .zero:    move.b        d1,-(a0)
  169.     subq.l        #1,d7
  170.     bgt.s        .loop
  171.     tst.w        d0
  172.     bne.s        .loop
  173.     move.l        a0,numtext_ptr
  174.     rts
  175.  
  176. *-------------------------------------------------------*
  177.     txtlong
  178. *-------------------------------------------------------*
  179. pushtext:
  180. *-------------------------------------------------------*
  181.     move.l        numtext_ptr,a1
  182.     moveq        #-1,d0
  183. .lp    addq.l        #1,d0
  184.     tst.b        (a0)+
  185.     bne.s        .lp
  186.     subq.l        #1,a0
  187.     bra.s        .go
  188. .cop:    move.b        -(a0),-(a1)
  189. .go:    dbra        d0,.cop
  190.     move.l        a1,numtext_ptr
  191.     rts
  192.  
  193. *-------------------------------------------------------*
  194. *    Print single character                *
  195. *-------------------------------------------------------*
  196. *    d0        character            *
  197. *    a1        screen                *            
  198. *-------------------------------------------------------*
  199.     txtlong
  200. *-------------------------------------------------------*
  201. print_char:
  202. *-------------------------------------------------------*
  203.     move.w        char_y,d7
  204.     move.l        a1,a3
  205.     mulu        scrwidth,d7
  206.     add.l        d7,d7
  207.     add.l        d7,a3
  208.     move.w        char_x,d7
  209.     ext.l        d7
  210.     add.l        d7,d7
  211.     add.l        d7,a3
  212.     lea        (a6,d0.w),a2
  213.     move.w        char_col,d1
  214.     move.w        #256,d6
  215.     move.w        scrwidth,d7
  216.     ext.l        d6
  217.     ext.l        d7
  218.     add.l        d7,d7
  219.     moveq        #6-1,d4
  220.     moveq        #0,d3
  221. .ylp    move.l        a3,a5
  222.     move.b        (a2),d0
  223.     add.b        d0,d0
  224.     bcc.s        .n1
  225.     move.w        d1,(a5)
  226. .n1    addq.l        #2,a5
  227.     add.b        d0,d0
  228.     bcc.s        .n2
  229.     move.w        d1,(a5)
  230. .n2    addq.l        #2,a5
  231.     add.b        d0,d0
  232.     bcc.s        .n3
  233.     move.w        d1,(a5)
  234. .n3    addq.l        #2,a5
  235.     add.b        d0,d0
  236.     bcc.s        .n4
  237.     move.w        d1,(a5)
  238. .n4    addq.l        #2,a5
  239.     add.b        d0,d0
  240.     bcc.s        .n5
  241.     move.w        d1,(a5)
  242. .n5    addq.l        #2,a5
  243.     add.b        d0,d0
  244.     bcc.s        .n6
  245.     move.w        d1,(a5)
  246. .n6    addq.l        #2,a5
  247.     tst.b        d3
  248.     beq.s        .next
  249.     add.b        d0,d0
  250.     bcc.s        .n7
  251.     move.w        d1,(a5)
  252. .n7    addq.l        #2,a5
  253.     add.b        d0,d0
  254.     bcc.s        .next
  255.     move.w        d1,(a5)
  256. .next    add.l        d6,a2
  257.     add.l        d7,a3
  258.     dbra        d4,.ylp
  259.     rts
  260.  
  261. *-------------------------------------------------------*
  262.     txtlong
  263. *-------------------------------------------------------*
  264. print_line:
  265. *-------------------------------------------------------*
  266.     pushall
  267.     move.l        fontptr,a6
  268.     move.l        screen,a1
  269. .loop    moveq        #0,d0
  270.     move.b        (a0)+,d0
  271.     beq.s        .out
  272.     cmp.w        #27,d0
  273.     beq.s        .ctrl
  274.     bsr        print_char
  275.     move.w        textgap,d0
  276.     add.w        d0,char_x
  277.     bra.s        .loop
  278. .out    popall
  279.     rts
  280. .ctrl    move.b        (a0)+,d0
  281.     cmp.b        #"Y",d0
  282.     beq.s        .pos
  283.     bra.s        .loop
  284. .pos    moveq        #0,d0
  285.     move.b        (a0)+,d0
  286.     move.w        d0,char_x
  287.     moveq        #0,d0
  288.     move.b        (a0)+,d0
  289.     add.w        d0,char_x
  290.     moveq        #0,d0
  291.     move.b        (a0)+,d0
  292.     move.w        d0,char_y
  293.     bra.s        .loop
  294.  
  295. *-------------------------------------------------------*
  296. init_font:
  297. *-------------------------------------------------------*
  298.     move.w        #6,textgap
  299.     move.l        #font,fontptr
  300.     move.l        fontptr,a0
  301.     lea        truefont,a1
  302.     move.w        #256-1,d0
  303. .char:    move.b        (a0)+,(a1)
  304.     move.b        (a0)+,256*1(a1)
  305.     move.b        (a0)+,256*2(a1)
  306.     move.b        (a0)+,256*3(a1)
  307.     move.b        (a0)+,256*4(a1)
  308.     move.b        (a0)+,256*5(a1)
  309.     addq.l        #1,a1
  310.     dbra        d0,.char
  311.     lea        truefont,a0
  312.     move.l        fontptr,a1
  313.     move.w        #256-1,d0
  314. .copy    move.l        (a0)+,(a1)+
  315.     move.w        (a0)+,(a1)+
  316.     dbra        d0,.copy
  317.     rts
  318.  
  319. *-------------------------------------------------------*
  320.     txtlong
  321. *-------------------------------------------------------*
  322. framecounter:
  323. *-------------------------------------------------------*
  324.     ifnd        debuggable
  325.     subq.w        #1,move_flag
  326.     and.w        #4-1,move_flag
  327.     bne.s        .sk
  328.     pushall
  329.     bsr        player_movement
  330.     popall
  331. .sk:
  332.     endc
  333. *-------------------------------------------------------*
  334.     addq.l        #1,fpsc
  335.     ifd        debuggable
  336.     jmp        ([old_timerc.l])
  337.     elseif
  338.     bclr        #5,$FFFFFA11.w
  339.     rte
  340.     endc
  341.  
  342. *-------------------------------------------------------*
  343.     txtlong
  344. *-------------------------------------------------------*
  345. new_vbi:
  346. *-------------------------------------------------------*
  347.     ifnd        debuggable
  348. *-------------------------------------------------------*
  349.     push.l        vbi_direction(pc)
  350.     rts
  351. *-------------------------------------------------------*
  352. vbi_direction:    dc.l    active_vbi
  353. *-------------------------------------------------------*
  354. active_vbi:
  355. *-------------------------------------------------------*
  356.     move.b        #0,tbcr.w
  357.     push.l        d0
  358.     move.w        height,d0
  359.     tst.b        ilace_active
  360.     beq.s        .no
  361.     lsr.w        #1,d0
  362. .no:    subq.w        #8,d0
  363.     move.b        d0,tbdr.w
  364.     move.b        #8,tbcr.w
  365.     pop.l        d0
  366. *-------------------------------------------------------*
  367.     endc
  368. *-------------------------------------------------------*
  369.     ifd        debuggable
  370.     pushall
  371.     bsr        player_movement
  372.     popall
  373.     endc
  374. *-------------------------------------------------------*
  375.     tst.w        timer
  376.     beq.s        .nd
  377.     subq.w        #1,timer
  378. .nd:    addq.l        #1,vbls
  379.     addq.w        #1,frame
  380.     ifnd        debuggable
  381.     addq.l        #1,$462.w
  382.     addq.l        #1,$466.w
  383.     move.l        #bypass_vbi,vbi_direction
  384.     endc
  385. *-------------------------------------------------------*
  386. bypass_vbi:
  387. *-------------------------------------------------------*
  388.     ifd        debuggable
  389.     rts
  390.     elseif
  391.     rte
  392.     endc
  393.  
  394. *-------------------------------------------------------*
  395.     ifnd        debuggable
  396. *-------------------------------------------------------*
  397. stabilizer_b:
  398. *-------------------------------------------------------*
  399.     move.l        #active_vbi,vbi_direction
  400.     move.b        #0,tbcr.w
  401.     bclr        #0,isra.w
  402.     rte
  403. *-------------------------------------------------------*
  404.     endc
  405. *-------------------------------------------------------*
  406.  
  407. *-------------------------------------------------------*
  408.             datlong
  409. *-------------------------------------------------------*
  410.     
  411. fps:            dc.b    " FPS",0
  412. frames:            dc.b    " VBL",0
  413. point:            dc.b    ".",0
  414.  
  415. *-------------------------------------------------------*
  416.             bsslong
  417. *-------------------------------------------------------*
  418.  
  419. old_vbi:        ds.l    1
  420. old_timerb:        ds.l    1
  421. old_timerc:        ds.l    1
  422. numtext_ptr:        ds.l    1
  423. fontptr:        ds.l    1
  424.  
  425. vbls:            ds.l    1
  426. ovbls:            ds.l    1
  427. fpsc:            ds.l    1
  428. fpso:            ds.l    1
  429. fc_history:        ds.l    8
  430.  
  431. timer:            ds.w    1
  432. char_x:            ds.w    1
  433. char_y:            ds.w    1
  434. char_col:        ds.w    1
  435. textgap:        ds.w    1
  436.  
  437. move_flag:        ds.w    1
  438.  
  439. truefont:        ds.w    256*8*8
  440.  
  441.             ds.b    256
  442. stringspace:        ds.b    1
  443.  
  444. old_iera:        ds.b    1
  445. old_ierb:        ds.b    1
  446. old_imra:        ds.b    1
  447. old_imrb:        ds.b    1
  448.  
  449. *-------------------------------------------------------*
  450.             txtlong
  451. *-------------------------------------------------------*
  452.